const fs = require("fs");
const path = require("path");
const cron = require("node-cron");

const { queryDatabase } = require("../lib/db"); // MySQL 查询函数
const { getCache, setCache, clearRedisCache } = require("../lib/redis"); // Redis 缓存

const { prefix } = require("./config")

// 站点地图配置
const MAX_URLS_PER_SITEMAP = 45000; // 每个站点地图最多存放 45000 个 URL
const PAGE_SIZE = 10; // 每次查询 100 条记录
const SITEMAP_DIR = path.join(process.cwd(), "public", "sitemaps");

// 确保目录存在，如果不存在则创建
if (!fs.existsSync(SITEMAP_DIR)) {
    fs.mkdirSync(SITEMAP_DIR, { recursive: true });
}

// 页面优先级 & 更新频率映射
const pagePriority = {
    "短剧": { changefreq: "daily", priority: 0.9 },
    "电影": { changefreq: "weekly", priority: 0.8 },
    "综艺": { changefreq: "weekly", priority: 0.7 },
    "动漫": { changefreq: "monthly", priority: 0.6 },
    "其他": { changefreq: "monthly", priority: 0.5 },
};

// 生成增量站点地图
async function generateIncrementalSitemap() {
    // console.log("⏳ 开始清除redis缓存")
    // await clearRedisCache()
    // console.log("⏳ 开始清除redis缓存")
    // return

    console.log("⏳ 开始生成增量更新的站点地图...");

    // 获取 Redis 中的上次更新时间
    let lastUpdateTime = await getCache("last_updatedAt");
    if (!lastUpdateTime) lastUpdateTime = "1970-01-01 00:00:00"; // 第一次运行时使用一个默认的时间

    let page = 0; // 当前页
    let urls = [];
    let hasMoreData = true;

    // 分页查询数据
    while (hasMoreData) {
        // 计算 OFFSET
        const offset = page * PAGE_SIZE;

        // 查询更新过的 URL
        const query = `
            SELECT id, quarkLink, updatedAt, category 
            FROM short_video
            WHERE updatedAt > '${lastUpdateTime}'
            ORDER BY updatedAt DESC
            LIMIT ${PAGE_SIZE} OFFSET ${offset}
        `;
        const result = await queryDatabase(query);

        if (result.length === 0) {
            hasMoreData = false; // 没有更多数据，退出循环
            console.log("🔄 没有更多新内容，跳过站点地图生成。");
            break;
        }

        urls = urls.concat(result); // 追加当前页的数据到 urls 数组
        page++; // 增加页码
    }

    // 按批次写入站点地图
    let sitemapIndex = 1;
    let urlsChunk = [];

    urls.forEach((item, index) => {
        const { id, updatedAt, category } = item;
        const { changefreq, priority } = pagePriority[category] || pagePriority["短剧"];

        const loc = `${prefix}/details/${id}`
        urlsChunk.push({ loc: loc, lastmod: updatedAt, changefreq, priority });

        if (urlsChunk.length >= MAX_URLS_PER_SITEMAP || index === urls.length - 1) {
            const sitemapContent = generateSitemapContent(urlsChunk);
            const sitemapFilename = `sitemap-all-${sitemapIndex}.xml`;
            const sitemapPath = path.join(SITEMAP_DIR, sitemapFilename);

            // 写入文件前，检查目录是否存在
            if (!fs.existsSync(SITEMAP_DIR)) {
                fs.mkdirSync(SITEMAP_DIR, { recursive: true });
            }

            fs.writeFileSync(sitemapPath, sitemapContent);
            console.log(`✅ 站点地图文件 ${sitemapFilename} 生成成功`);

            // 存入 Redis 缓存
            setCache(`dynamic_sitemap_${sitemapIndex}`, sitemapContent, 3600);
            urlsChunk = []; // 清空数组
            sitemapIndex++;
        }
    });

    // 更新 Redis 记录的最新更新时间
    const currentTime = new Date().toISOString().slice(0, 19).replace("T", " ");
    await setCache("last_updatedAt", currentTime);
    console.log("✅ 增量站点地图更新完成！");
}

// 生成 XML 站点地图内容
function generateSitemapContent(urls) {
    return `<?xml version="1.0" encoding="UTF-8"?>
  <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    ${urls
            .map(({ loc, lastmod, changefreq, priority }) => ` 
      <url>
        <loc>${loc}</loc>
        <lastmod>${new Date(lastmod).toISOString()}</lastmod>
        <changefreq>${changefreq}</changefreq>
        <priority>${priority}</priority>
      </url>`)
            .join("")}
  </urlset>`;
}

// 导出
module.exports = { generateIncrementalSitemap };